/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vocales;

import java.util.Scanner;

/**
 *
 * @author miguel
 */
public class perceptron {

    static double factorA = 0.5, resultado = 0;
    double pesos[];
    double salidas[];
    double entradas[][];
    boolean cumple = false;

    void imprime_pesos() {

        for (int i = 0; i < this.pesos.length; i++) {
            System.out.println("Peso " + (i + 1) + " = " + this.pesos[i]);
        }

    }

    perceptron(int entradas) {

        this.entradas = new double[(int) Math.pow(2, (entradas))][entradas + 1];
        this.pesos = new double[entradas + 1];
        this.salidas = new double[(int) Math.pow(2, (entradas))];
        asignar_pesos();
    }

    private void asignar_pesos() {

        Scanner s = new Scanner(System.in);
        String lectura;
        double peso;

        for (int i = 0; i < this.pesos.length; i++) {
            System.out.println("Digite el peso para la entrada " + (i + 1));
            lectura = s.next();
            peso = Double.parseDouble(lectura);
            this.pesos[i] = peso;
        }
        System.out.println("Los pesos ingresados son :");
        for (int i = 0; i < this.pesos.length; i++) {
            System.out.println("Peso " + (i + 1) + " = " + this.pesos[i]);
        }
    }

    void evaluar() {

        System.out.println("Filas : " + this.entradas.length);
        System.out.println("Columnas : " + this.entradas[0].length);

        resultado = 0;

        for (int fila = 0; fila < this.entradas.length; fila++) {
            for (int columna = 0; columna < this.entradas[0].length; columna++) {
                resultado = resultado + (this.entradas[fila][columna] * this.pesos[columna]);
            }
            System.out.println("resultado = " + resultado + " Salida esperada = " + this.salidas[fila]);

            if ((resultado < 0 && salidas[fila] < 0) || (resultado > 0 && salidas[fila] > 0)) {
                cumple = true;
            } else {
                cumple = false;
                System.out.println("No cumplio en la fila : " + fila);
                System.out.println("Se debe recalcular");
                recalcular_pesos(fila);

            }
        }
    }

    void recalcular_pesos(int fila) {

        boolean evalua2 = false;
        System.out.println("Inicio de recalculo de pesos en la fila " + fila);
        System.out.println("Filas :" + this.entradas.length);
        System.out.println("Columnas :" + this.entradas[0].length);

        for (int columna = 0; columna < this.entradas[0].length; columna++) {
            this.pesos[columna] = this.pesos[columna] + (2 * factorA * this.entradas[fila][columna] * salidas[fila]);
            System.out.println(columna + " " + this.pesos[columna]);
        }
        evalua2 = evalua2(fila);
        if (evalua2 == false) {
            recalcular_pesos(fila);
        }
    }

    boolean evalua2(int fila) {

        System.out.println("Inicio de evaluo de pesos recalculados en la fila " + fila);
        boolean evalua2 = false;
        resultado = 0;

        for (int columna = 0; columna < this.entradas[0].length; columna++) {
            resultado = resultado + (this.entradas[fila][columna] * this.pesos[columna]);
        }
        System.out.println("resultado = " + resultado + " Salida esperada = " + this.salidas[fila]);

        if ((resultado < 0 && salidas[fila] < 0) || (resultado > 0 && salidas[fila] > 0)) {
            evalua2 = true;
        } else {
            evalua2 = false;
            System.out.println("No cumplio en la fila : " + fila);
            System.out.println("Se debe recalcular");
        }
        return evalua2;
    }

    /* pendiente desarrollo
     void llenar (){

     int saltos =1, aux=0;
     for (int columna = 0; columna < this.entradas.length; columna++) {
     while(aux==saltos)
     for (int fila = 0; fila < this.entradas[0].length; fila++) {
     this.entradas[columna][fila]=-1;
     aux++;
     }
     saltos= saltos+saltos;
     }

     }
     * */
    void llenar_salida1() {

        this.salidas[0] = -1;
        this.salidas[1] = -1;
        this.salidas[2] = 1;
        this.salidas[3] = -1;
        this.salidas[4] = -1;
        this.salidas[5] = -1;
        this.salidas[6] = 1;
        this.salidas[7] = -1;
        this.salidas[8] = 1;
        this.salidas[9] = -1;
        this.salidas[10] = 1;
        this.salidas[11] = 1;
        this.salidas[12] = 1;
        this.salidas[13] = -1;
        this.salidas[14] = 1;
        this.salidas[15] = 1;
        this.salidas[16] = -1;
        this.salidas[17] = -1;
        this.salidas[18] = -1;
        this.salidas[19] = -1;
        this.salidas[20] = -1;
        this.salidas[21] = -1;
        this.salidas[22] = 1;
        this.salidas[23] = 1;
        this.salidas[24] = -1;
        this.salidas[25] = -1;
        this.salidas[26] = 1;
        this.salidas[27] = 1;
        this.salidas[28] = 1;
        this.salidas[29] = 1;
        this.salidas[30] = 1;
        this.salidas[31] = 1;
    }

    void llenar_salida2() {
        this.salidas[0] = -1;
        this.salidas[1] = -1;
        this.salidas[2] = -1;
        this.salidas[3] = -1;
        this.salidas[4] = -1;
        this.salidas[5] = -1;
        this.salidas[6] = -1;
        this.salidas[7] = -1;
        this.salidas[8] = -1;
        this.salidas[9] = -1;
        this.salidas[10] = -1;
        this.salidas[11] = 1;
        this.salidas[12] = -1;
        this.salidas[13] = -1;
        this.salidas[14] = 1;
        this.salidas[15] = 1;
        this.salidas[16] = -1;
        this.salidas[17] = -1;
        this.salidas[18] = -1;
        this.salidas[19] = -1;
        this.salidas[20] = 1;
        this.salidas[21] = 1;
        this.salidas[22] = 1;
        this.salidas[23] = 1;
        this.salidas[24] = -1;
        this.salidas[25] = -1;
        this.salidas[26] = 1;
        this.salidas[27] = 1;
        this.salidas[28] = 1;
        this.salidas[29] = 1;
        this.salidas[30] = 1;
        this.salidas[31] = 1;
    }

    void llenar_salida3() {
        this.salidas[0] = -1;
        this.salidas[1] = -1;
        this.salidas[2] = 1;
        this.salidas[3] = -1;
        this.salidas[4] = 1;
        this.salidas[5] = -1;
        this.salidas[6] = 1;
        this.salidas[7] = 1;
        this.salidas[8] = 1;
        this.salidas[9] = -1;
        this.salidas[10] = 1;
        this.salidas[11] = 1;
        this.salidas[12] = 1;
        this.salidas[13] = 1;
        this.salidas[14] = 1;
        this.salidas[15] = 1;
        this.salidas[16] = -1;
        this.salidas[17] = -1;
        this.salidas[18] = -1;
        this.salidas[19] = -1;
        this.salidas[20] = -1;
        this.salidas[21] = -1;
        this.salidas[22] = 1;
        this.salidas[23] = 1;
        this.salidas[24] = -1;
        this.salidas[25] = -1;
        this.salidas[26] = 1;
        this.salidas[27] = 1;
        this.salidas[28] = 1;
        this.salidas[29] = 1;
        this.salidas[30] = 1;
        this.salidas[31] = 1;
    }

    void llenar_entradas() {
        this.entradas[0][0] = -1;
        this.entradas[1][0] = 1;
        this.entradas[2][0] = -1;
        this.entradas[3][0] = 1;
        this.entradas[4][0] = -1;
        this.entradas[5][0] = 1;
        this.entradas[6][0] = -1;
        this.entradas[7][0] = 1;
        this.entradas[8][0] = -1;
        this.entradas[9][0] = 1;
        this.entradas[10][0] = -1;
        this.entradas[11][0] = 1;
        this.entradas[12][0] = -1;
        this.entradas[13][0] = 1;
        this.entradas[14][0] = -1;
        this.entradas[15][0] = 1;
        this.entradas[16][0] = -1;
        this.entradas[17][0] = 1;
        this.entradas[18][0] = -1;
        this.entradas[19][0] = 1;
        this.entradas[20][0] = -1;
        this.entradas[21][0] = 1;
        this.entradas[22][0] = -1;
        this.entradas[23][0] = 1;
        this.entradas[24][0] = -1;
        this.entradas[25][0] = 1;
        this.entradas[26][0] = -1;
        this.entradas[27][0] = 1;
        this.entradas[28][0] = -1;
        this.entradas[29][0] = 1;
        this.entradas[30][0] = -1;
        this.entradas[31][0] = 1;

        this.entradas[0][1] = -1;
        this.entradas[1][1] = -1;
        this.entradas[2][1] = 1;
        this.entradas[3][1] = 1;
        this.entradas[4][1] = -1;
        this.entradas[5][1] = -1;
        this.entradas[6][1] = 1;
        this.entradas[7][1] = 1;
        this.entradas[8][1] = -1;
        this.entradas[9][1] = -1;
        this.entradas[10][1] = 1;
        this.entradas[11][1] = 1;
        this.entradas[12][1] = -1;
        this.entradas[13][1] = -1;
        this.entradas[14][1] = 1;
        this.entradas[15][1] = 1;
        this.entradas[16][1] = -1;
        this.entradas[17][1] = -1;
        this.entradas[18][1] = 1;
        this.entradas[19][1] = 1;
        this.entradas[20][1] = -1;
        this.entradas[21][1] = -1;
        this.entradas[22][1] = 1;
        this.entradas[23][1] = 1;
        this.entradas[24][1] = -1;
        this.entradas[25][1] = -1;
        this.entradas[26][1] = 1;
        this.entradas[27][1] = 1;
        this.entradas[28][1] = -1;
        this.entradas[29][1] = -1;
        this.entradas[30][1] = 1;
        this.entradas[31][1] = 1;


        this.entradas[0][2] = -1;
        this.entradas[1][2] = -1;
        this.entradas[2][2] = -1;
        this.entradas[3][2] = -1;
        this.entradas[4][2] = 1;
        this.entradas[5][2] = 1;
        this.entradas[6][2] = 1;
        this.entradas[7][2] = 1;
        this.entradas[8][2] = -1;
        this.entradas[9][2] = -1;
        this.entradas[10][2] = -1;
        this.entradas[11][2] = -1;
        this.entradas[12][2] = 1;
        this.entradas[13][2] = 1;
        this.entradas[14][2] = 1;
        this.entradas[15][2] = 1;
        this.entradas[16][2] = -1;
        this.entradas[17][2] = -1;
        this.entradas[18][2] = -1;
        this.entradas[19][2] = -1;
        this.entradas[20][2] = 1;
        this.entradas[21][2] = 1;
        this.entradas[22][2] = 1;
        this.entradas[23][2] = 1;
        this.entradas[24][2] = -1;
        this.entradas[25][2] = -1;
        this.entradas[26][2] = -1;
        this.entradas[27][2] = -1;
        this.entradas[28][2] = 1;
        this.entradas[29][2] = 1;
        this.entradas[30][2] = 1;
        this.entradas[31][2] = 1;

        this.entradas[0][3] = -1;
        this.entradas[1][3] = -1;
        this.entradas[2][3] = -1;
        this.entradas[3][3] = -1;
        this.entradas[4][3] = -1;
        this.entradas[5][3] = -1;
        this.entradas[6][3] = -1;
        this.entradas[7][3] = -1;
        this.entradas[8][3] = 1;
        this.entradas[9][3] = 1;
        this.entradas[10][3] = 1;
        this.entradas[11][3] = 1;
        this.entradas[12][3] = 1;
        this.entradas[13][3] = 1;
        this.entradas[14][3] = 1;
        this.entradas[15][3] = 1;
        this.entradas[16][3] = -1;
        this.entradas[17][3] = -1;
        this.entradas[18][3] = -1;
        this.entradas[19][3] = -1;
        this.entradas[20][3] = -1;
        this.entradas[21][3] = -1;
        this.entradas[22][3] = -1;
        this.entradas[23][3] = -1;
        this.entradas[24][3] = 1;
        this.entradas[25][3] = 1;
        this.entradas[26][3] = 1;
        this.entradas[27][3] = 1;
        this.entradas[28][3] = 1;
        this.entradas[29][3] = 1;
        this.entradas[30][3] = 1;
        this.entradas[31][3] = 1;

        this.entradas[0][4] = -1;
        this.entradas[1][4] = -1;
        this.entradas[2][4] = -1;
        this.entradas[3][4] = -1;
        this.entradas[4][4] = -1;
        this.entradas[5][4] = -1;
        this.entradas[6][4] = -1;
        this.entradas[7][4] = -1;
        this.entradas[8][4] = -1;
        this.entradas[9][4] = -1;
        this.entradas[10][4] = -1;
        this.entradas[11][4] = -1;
        this.entradas[12][4] = -1;
        this.entradas[13][4] = -1;
        this.entradas[14][4] = -1;
        this.entradas[15][4] = -1;
        this.entradas[16][4] = 1;
        this.entradas[17][4] = 1;
        this.entradas[18][4] = 1;
        this.entradas[19][4] = 1;
        this.entradas[20][4] = 1;
        this.entradas[21][4] = 1;
        this.entradas[22][4] = 1;
        this.entradas[23][4] = 1;
        this.entradas[24][4] = 1;
        this.entradas[25][4] = 1;
        this.entradas[26][4] = 1;
        this.entradas[27][4] = 1;
        this.entradas[28][4] = 1;
        this.entradas[29][4] = 1;
        this.entradas[30][4] = 1;
        this.entradas[31][4] = 1;

//llenado del umbral
        this.entradas[0][5] = 1;
        this.entradas[1][5] = 1;
        this.entradas[2][5] = 1;
        this.entradas[3][5] = 1;
        this.entradas[4][5] = 1;
        this.entradas[5][5] = 1;
        this.entradas[6][5] = 1;
        this.entradas[7][5] = 1;
        this.entradas[8][5] = 1;
        this.entradas[9][5] = 1;
        this.entradas[10][5] = 1;
        this.entradas[11][5] = 1;
        this.entradas[12][5] = 1;
        this.entradas[13][5] = 1;
        this.entradas[14][5] = 1;
        this.entradas[15][5] = 1;
        this.entradas[16][5] = 1;
        this.entradas[17][5] = 1;
        this.entradas[18][5] = 1;
        this.entradas[19][5] = 1;
        this.entradas[20][5] = 1;
        this.entradas[21][5] = 1;
        this.entradas[22][5] = 1;
        this.entradas[23][5] = 1;
        this.entradas[24][5] = 1;
        this.entradas[25][5] = 1;
        this.entradas[26][5] = 1;
        this.entradas[27][5] = 1;
        this.entradas[28][5] = 1;
        this.entradas[29][5] = 1;
        this.entradas[30][5] = 1;
        this.entradas[31][5] = 1;

    }

    void llenar_xor1() {

        this.entradas[0][0] = 1;
        this.entradas[1][0] = -1;
        this.entradas[2][0] = 1;
        this.entradas[3][0] = -1;

        this.entradas[0][1] = -1;
        this.entradas[1][1] = -1;
        this.entradas[2][1] = 1;
        this.entradas[3][1] = 1;

        this.entradas[0][2] = 1;
        this.entradas[1][2] = 1;
        this.entradas[2][2] = 1;
        this.entradas[3][2] = 1;

        this.salidas[0] = -1;
        this.salidas[1] = -1;
        this.salidas[2] = 1;
        this.salidas[3] = -1;

    }

    void llenar_xor2() {

        this.entradas[0][0] = -1;
        this.entradas[1][0] = 1;
        this.entradas[2][0] = -1;
        this.entradas[3][0] = 1;

        this.entradas[0][1] = 1;
        this.entradas[1][1] = 1;
        this.entradas[2][1] = -1;
        this.entradas[3][1] = -1;

        this.entradas[0][2] = 1;
        this.entradas[1][2] = 1;
        this.entradas[2][2] = 1;
        this.entradas[3][2] = 1;

        this.salidas[0] = -1;
        this.salidas[1] = 1;
        this.salidas[2] = -1;
        this.salidas[3] = -1;

    }

    void conecta_neurona(perceptron neurona1, perceptron neurona2) {

        this.entradas[0][2] = 1;
        this.entradas[1][2] = 1;
        this.entradas[2][2] = 1;
        this.entradas[3][2] = 1;
        
        this.salidas[0] = -1;
        this.salidas[1] = 1;
        this.salidas[2] = 1;
        this.salidas[3] = -1;
        
        for (int fila = 0; fila < this.entradas.length; fila++) {
                this.entradas[fila][0]=neurona1.salidas[fila];
                this.entradas[fila][1]=neurona2.salidas[fila];
            }
        
        
    }
}
